package com.zyf.concurrency.chapter14;

import com.zyf.concurrency.annotations.GuardedBy;
import com.zyf.concurrency.annotations.ThreadSafe;

/**
 * 有界缓存实现的基类
 * 引自原文：
 *      接下来介绍有界缓存的几种实现，其中将采用不同的方法来处理前提条件失败的问题。在
 * 每种实现中都扩展了程序清单14-2中的BaseBoundedBuffer,在这个类中实现了一个基于数组
 * 的循环缓存，其中各个缓存状态变量(buf、 head、 tail 和count)均由缓存的内置锁来保护。它
 * 还提供了同步的doPut和doTake方法，并在子类中通过这些方法来实现put和take操作，底层
 * 的状态将对子类隐藏。
 * create by yifeng
 */
@ThreadSafe
public abstract class BaseBoundedBuffer <V> {
    @GuardedBy("this") private final V[] buf;
    @GuardedBy("this") private int tail;
    @GuardedBy("this") private int head;
    @GuardedBy("this") private int count;

    protected BaseBoundedBuffer(int capacity) {
        this.buf = (V[]) new Object[capacity];
    }

    protected synchronized final void doPut(V v) {
        buf[tail] = v;
        if (++tail == buf.length) {
            tail = 0;
        }
        ++count;
    }

    protected synchronized final V doTake() {
        V v = buf[head];
        buf[head] = null;
        if (++head == buf.length) {
            head = 0;
        }
        --count;
        return v;
    }

    public synchronized final boolean isFull() {
        return count == buf.length;
    }

    public synchronized final boolean isEmpty() {
        return count == 0;
    }


}
